#include <stdio.h>

typedef char T[10]; //T是数组类型，数组长度为10的字符数组
T *a; //定义了一个指针，指针指向 度为10的字符数组

//问a是什么类型？

typedef char *S; //T是字符指针类型
S b[10]; //定义了一个数组，数组内是字符指针

//问b是什么类型？





//a应为 char (*a)[10]
//b应为 char *a[10]

/*
char (*a)[10]声明一个指向含有10个char型元素的数组的指针，仅有一个指针，这个指针指向含有10个char型元素的数组。
char *a[10] 声明10个char型指针，即一个有10个char型指针的数组。


char (*a)[10]
先找到声明符a,被括号括着，先看括号内的(优先级高)，然后向右看，没有，向左看,是*，说明s是个指针，什么指针？在看括号外面的，先向右看，有[] 是个数组，说明a是个指向数组的指针，再向左看，是char，说明数组的每个元素是char。所以，这是一个指向存放char的数组的指针。
char *a[10]
先找到声明符a,然后向右看，有[]说明a是个数组，再向左看，是char *，说明数组中的每个元素是char *。所以这是一个存放char指针的数组。

以上这样解释的理由，源自操作符优先级：
[ ] 数组下标，( )圆括号 的优先级都是1，而*的优先级为2. 优先级为1的结合方向是从左到右，优先级2的结合方向是从右到左。
详细参见：https://baike.baidu.com/item/%E8%BF%90%E7%AE%97%E7%AC%A6%E4%BC%98%E5%85%88%E7%BA%A7/4752611
*/

int main(void)
{
	// 验证如下 :
	printf("%d\n",sizeof(a));  //8 (64位机器上，一个指针8字节)
	printf("%d",sizeof(b));  //80 (64位机器上，一个指针8字节)
}
